package xyz.esion.blog.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.util.CollectionUtils;
import xyz.esion.blog.constant.PathConstant;

import java.io.File;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatterBuilder;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author Esion
 * @since 2021/12/4
 */
public class FieldUtil {


    /**
     * 默认日期
     */
    public static final LocalDate DEFAULT_DATE = LocalDate.of(1972, 1, 1);

    /**
     * 默认时间
     */
    public static final LocalDateTime DEFAULT_DATE_TIME =
            LocalDateTime.of(1972, 1, 1, 0, 0, 0);

    /**
     * 默认扁平化数组分隔符
     */
    public static final String DEFAULT_LIST_SEPARATOR = "-";

    /**
     * 默认日期时间格式化
     */
    public static final String DEFAULT_DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    /**
     * 默认日期格式化
     */
    public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";

    /**
     * 默认主键字段
     */
    public static final String PRIMARY_COLUMN = "id";
    private static final String QQ_EMAIL = "@qq.com";
    private static final String FAVICON = "/favicon.ico";

    public static String getIconByEmailOrWebsite(String email, String website) {
        if (StrUtil.isNotBlank(email)) {
            if (email.contains(QQ_EMAIL)) {
                return StrUtil.format("http://q2.qlogo.cn/headimg_dl?dst_uin={}&spec=100",
                        email.replace(QQ_EMAIL, ""));
            } else {
                return website + FAVICON;
            }
        } else {
            return website + FAVICON;
        }
    }

    /**
     * 美化结果路径
     * <li>分隔符转换</li>
     * <li>路径抹除</li>
     *
     * @param path   需要美化的路径
     * @param prefix 需要删除的前缀
     * @return 路径
     */
    public static String buildResultPath(String path, String prefix) {
        if (path.length() > prefix.length()) {
            return path.substring(prefix.length()).replace(File.separator, PathConstant.WEB_SEPARATOR);
        }
        return path;
    }

    /**
     * 字符串转数组，使用默认类型，默认分隔符-
     *
     * @param str 字符串
     * @return 数组
     */
    public static List<Integer> stringToList(String str) {
        return stringToList(str, DEFAULT_LIST_SEPARATOR, Integer.class);
    }

    /**
     * 字符串转数组，默认分隔符-
     *
     * @param str  字符串
     * @param type 类型
     * @param <T>  数组类型
     * @return 数组
     */
    public static <T> List<T> stringToList(String str, Class<T> type) {
        return stringToList(str, DEFAULT_LIST_SEPARATOR, type);
    }

    /**
     * 字符串转数组
     *
     * @param str       字符串
     * @param separator 分隔符
     * @param type      类型
     * @param <T>       数组类型
     * @return 数组
     */
    public static <T> List<T> stringToList(String str, String separator, Class<T> type) {
        List<String> items = CollUtil.removeAny(StrUtil.split(str, separator), "");
        return items.stream().map(e -> Convert.convert(type, e)).collect(Collectors.toList());
    }

    /**
     * 数组转字符串
     *
     * @param list      数组
     * @param separator 分隔符
     * @param isTrim    是否去除两边
     * @param <T>       数组类型
     * @return 字符串
     */
    public static <T> String listToString(List<T> list, String separator, boolean isTrim) {
        if (CollectionUtils.isEmpty(list)) {
            return "";
        }
        String str = CollUtil.join(list, separator);
        if (isTrim) {
            return str;
        } else {
            return separator + str + separator;
        }
    }

    /**
     * 格式化日期，默认yyyy-MM-dd
     *
     * @param date 日期
     * @return 格式化之后的字符串
     */
    public static String dateFormat(LocalDate date) {
        return dateFormat(date, DEFAULT_DATE_PATTERN);
    }

    /**
     * 格式化日期
     *
     * @param date   日期
     * @param format 格式化字符串，具体参考 {@link DateTimeFormatterBuilder#appendPattern(String)}
     * @return 格式化之后的字符串
     */
    public static String dateFormat(LocalDate date, String format) {
        if (DEFAULT_DATE.equals(date)) {
            return "";
        }
        return LocalDateTimeUtil.format(date, format);
    }

    /**
     * 格式化日期时间，默认yyyy-MM-dd HH:mm:ss
     *
     * @param dateTime 日期时间
     * @return 格式化之后的字符串
     */
    public static String dateFormat(LocalDateTime dateTime) {
        return dateFormat(dateTime, DEFAULT_DATE_TIME_PATTERN);
    }

    /**
     * 格式化日期时间
     *
     * @param dateTime 日期时间
     * @param format   格式化字符串，具体参考 {@link DateTimeFormatterBuilder#appendPattern(String)}
     * @return 格式化之后的字符串
     */
    public static String dateFormat(LocalDateTime dateTime, String format) {
        if (DEFAULT_DATE_TIME.equals(dateTime)) {
            return "";
        }
        return LocalDateTimeUtil.format(dateTime, format);
    }

}
